package com.tbit.main.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.tbit.main.constant.enums.DispatchApplyHandleType;
import com.tbit.main.pojo.AccountUser;
import com.tbit.main.pojo.DispatchApplyLog;
import com.tbit.main.pojo.DispatchApplyMachine;
import com.tbit.main.pojo.VO.DispatchApplyLogStat;
import com.tbit.main.pojo.VO.DispatchApplyLogVo;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @Author: chen
 * @Description: 调度申请
 * @Date: 创建于 15:44 2023/2/10
 */
public interface DispatchApplyLogService extends IService<DispatchApplyLog> {

    /**
     * 分组统计用户调度申请次数分布
     *
     * @param accountId 区域id
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    List<DispatchApplyLogVo> getApplyLogStat(AccountUser accountUser, Integer accountId, Long startTime, Long endTime);

    /**
     * 通过运维人员跟状态分组
     *
     * @param accountId 区域id
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    List<DispatchApplyLogStat> groupByAccountIdState(AccountUser accountUser, Integer accountId, Long startTime, Long endTime);

    /**
     * 查询指定运维人员调度申请记录
     *
     * @param accountUserId 运维用户id
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @param mapType       地图类型
     * @return
     */
    List<DispatchApplyLog> getByIdAndTime(Integer accountUserId, Long startTime, Long endTime, Integer mapType, Integer accountId);

    /**
     * 通过申请id查询
     *
     * @param applyId 申请记录id
     * @return
     */
    List<DispatchApplyMachine> getByApplyId(Integer applyId);

    /**
     * 申请
     *
     * @param userCode    车辆编号集合
     * @param reason      申请理由
     * @param lon         经度
     * @param lat         纬度
     * @param accountUser 用户信息
     * @param mapType     地图类型
     */
    void addBatch(List<String> userCode, String reason, Double lon, Double lat, AccountUser accountUser, Integer mapType, List<String> photoUrl, boolean isNew) throws Exception;

    /**
     * 处理
     *
     * @param applyId 申请记录id
     * @param state   状态
     * @param remark  审核备注
     */
    boolean handle(Integer applyId, Integer state, String remark, AccountUser accountUser, DispatchApplyHandleType handleType);

    /**
     * 通过申请id查询
     *
     * @param applyId 申请记录id
     * @return
     */
    List<DispatchApplyLog> getByApplyIdDispatch(Integer applyId);

    /**
     * 查询指定运维人员可调度数量
     *
     *  OCCUPY_NO_LIMIT = -999 无限制
     * @param accountUser 运维人员
     * @param accountId 区域id
     * @return 可调度数量
     */
    Integer checkMachineOccupy(AccountUser accountUser,Integer accountId);
}
